/*
 * 
 */

package Dblayer;
import Modellayer.*;
import java.sql.*;
import java.util.ArrayList;
/**
 *
 * @author Søren
 */
public class DBArbejdsdage implements IFDBArbejdsdage {

    private Connection con;
    public DBArbejdsdage()
    {
	con = DBConnection.getInstance().getDBcon();
    }

    public ArbejdsDage findArbejdsdage(int arbID, boolean retrieveAssociation) {
        String wClause = "  arbID = '" + arbID + "'";
        return singleWhere(wClause, retrieveAssociation);
    }
	public ArrayList<ArbejdsDage> findArbejdsdageMedMedNr(int medNr, boolean retrieveAssociation)
	{
		String wClause = " medNr = '" + medNr + "'";
		return miscWhere(wClause, retrieveAssociation);
	}

    public ArrayList<ArbejdsDage> hentArbejdsdage(boolean retrieveAssociation)
    {
        return miscWhere("", retrieveAssociation);
    }

    public int opretArbejdsdage(ArbejdsDage arbejdsdage) {
    int rc = -1;
    String query="INSERT INTO semarbejdsdage(arbID, dato, weekend, aften, timer, loen, medNr)  VALUES('"+
	  		arbejdsdage.getArbID()  + "','"  +
			arbejdsdage.getDato() + "','" +
			arbejdsdage.isWeekend() + "','" +
                        arbejdsdage.isAften() + "','" +
                        arbejdsdage.getTimer() + "','" +
                        arbejdsdage.getLoen() + "','" +
			arbejdsdage.getMedNr().getMedNr() + "')";

      System.out.println("insert : " + query);
      try{ // indsæt ny arbejdsdag
            Statement stmt = con.createStatement();
	 	  	stmt.setQueryTimeout(5);
	 	  	rc = stmt.executeUpdate(query);
	 	  	stmt.close();
		}//slut "try"
	 	catch(Exception ex){
	 	  	System.out.println("Insert exception in semarbejdsdage db: "+ex);
	   }
	   return(rc);
	}


    public int redigerArbejdsdage(ArbejdsDage arbejdsdage) {
       ArbejdsDage arbejdsdageObj  = arbejdsdage;
		int rc=-1;

		String query="UPDATE semArbejdsdage SET "+
                        "dato ='" + arbejdsdageObj.getDato() + "', " +
                        "weekend ='" + arbejdsdageObj.isWeekend() + "', " +
                        "aften ='" + arbejdsdageObj.isAften() + "', " +
                        "timer ='" + arbejdsdageObj.getTimer() + "', " +
                        "loen ='" + arbejdsdageObj.getLoen() + "' " +
		        " WHERE arbID = '"+ arbejdsdageObj.getArbID() + "'";

                System.out.println("Update query:" + query);
  		try{ // opdater arbejdsdag
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 	 	rc = stmt.executeUpdate(query);

	 	 	stmt.close();
		}//slut "try"
	 	catch(Exception ex){
	 	 	System.out.println("Update exception in semArbejdsdage db: "+ex);
	  	}
		return(rc);
    }

    public void sletArbejdsdage(int ID)
	{
               int rc=-1;

	  	String query="DELETE FROM semArbejdsdage WHERE arbID = '" +
				ID + "'";
                System.out.println(query);
	  	try{ // slet fra arbejdsdage
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 	  	rc = stmt.executeUpdate(query);
	 	  	stmt.close();
  		}//slut "try"
   	        catch(Exception ex){
	 	  	System.out.println("Delete exception in semArbejdsdage db: "+ex);
   	        }
	}

    private ArrayList<ArbejdsDage> miscWhere(String wClause, boolean retrieveAssociation)
	{

		ResultSet results;
	    ArrayList<ArbejdsDage> list = new ArrayList<ArbejdsDage>();

	    String query =  buildQuery(wClause);

            try{ // læs semArbejdsdage fra databasen
		Statement stmt = con.createStatement();
	 	stmt.setQueryTimeout(5);
	 	results = stmt.executeQuery(query);

		int snr=0;
		while( results.next() ){
	     	 ArbejdsDage arbejdsdageObj = new ArbejdsDage();
		 arbejdsdageObj = buildArbejdsdage(results);
                 list.add(arbejdsdageObj);
		}//slut "while"
                 stmt.close();
                 if(retrieveAssociation)
                 {   //medarbejderen bliver også bygget
                     for(ArbejdsDage arbejdsdageObj : list){
						IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
                        Medarbejder medarbejderObj = dbMedarbejderObj.findMedarbejder(arbejdsdageObj.getMedNr().getMedNr());
                        System.out.println("medarbejder is seleceted ");
						arbejdsdageObj.setMedNr(medarbejderObj);
                     }
                 }//slut "if"

		}//slut "try"
	 	catch(Exception e){
	 		System.out.println("Query exception - select: "+e);
			e.printStackTrace();
	 	}
		return list;
	}

    //Singelwhere bliver brugt når der kun er 1 ting
    private ArbejdsDage singleWhere(String wClause, boolean retrieveAssociation)
    {
           ResultSet results;
           ArbejdsDage arbejdsdageObj = new ArbejdsDage();

	   String query =  buildQuery(wClause);
           System.out.println(query);
		try{ // læs semArbejdsdage fra databasen
	 		Statement stmt = con.createStatement();
	 		stmt.setQueryTimeout(5);
	 		results = stmt.executeQuery(query);

	 		if( results.next() ){
                            arbejdsdageObj = buildArbejdsdage(results);
                            //assosiationen bliver bygget
                            stmt.close();
                        if(retrieveAssociation)
                            { 
			IFDBMedarbejder dbMedarbejderObj = new DBMedarbejder();
                        Medarbejder medarbejderObj = dbMedarbejderObj.findMedarbejder(arbejdsdageObj.getMedNr().getMedNr());
                        System.out.println("medarbejder is seleceted ");
			arbejdsdageObj.setMedNr(medarbejderObj);
                            }

			}
                        else{ //ingen arbejdsdage blev fundet
                            arbejdsdageObj = null;
                        }
		}//slut "try"
	 	catch(Exception e){
	 		System.out.println("Query exception: "+e);
	 	}
		return arbejdsdageObj;
	}
	//metoden der bygger en "query"
	private String buildQuery(String wClause)
	{
	    String query="SELECT arbID, dato, weekend, aften, timer, loen, medNr FROM semArbejdsdage";

		if (wClause.length()>0)
			query=query+" WHERE "+ wClause;

		return query;
	}

	private ArbejdsDage buildArbejdsdage(ResultSet results)
        {
            ArbejdsDage arbejdsdageObj = new ArbejdsDage();
            Medarbejder medarbejderObj = new Medarbejder();
            try{ // the columns from the table persiCustomer are used
                arbejdsdageObj.setArbID(results.getInt("arbID"));
                arbejdsdageObj.setDato(results.getString("dato"));
                arbejdsdageObj.setWeekend(results.getBoolean("weekend"));
                arbejdsdageObj.setAften(results.getBoolean("aften"));
				arbejdsdageObj.setTimer((results.getInt("timer")));
                arbejdsdageObj.setLoen(results.getDouble("loen"));
				medarbejderObj.setMedNr(results.getInt("medNr"));
				arbejdsdageObj.setMedNr(medarbejderObj);
          }
         catch(Exception e)
         {
             System.out.println("error in building the arbejdsdage object");
         }
         return arbejdsdageObj;
      }
}
